//
//  CZOauthViewController.swift
//  微博08
//
//  Created by apple on 16/2/27.
//  Copyright © 2016年 itcast. All rights reserved.
//

import UIKit
import SVProgressHUD

class CZOauthViewController: UIViewController {
    
    override func loadView() {
        self.view = webView
        webView.delegate = self
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // 设置背景颜色
        view.backgroundColor = UIColor.whiteColor()
        
        // 设置导航栏
        setupNavigationBar()
        
        // 1.加载授权登录界面
        let request = NSURLRequest(URL: CZNetworkTool.sharedInstance.oauthLoginUrl())
        webView.loadRequest(request)
    }

    /// 设置导航栏
    func setupNavigationBar() {
        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "填充", style: UIBarButtonItemStyle.Plain, target: self, action: "autoFill")
        
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "取消", style: UIBarButtonItemStyle.Plain, target: self, action: "close")
    }
    
    // MARK: - item点击方法
    func autoFill() {
        // 执行js代码,自动填充账号密码
        let js = "document.getElementById('userId').value='czbkiosweibo@163.com';document.getElementById('passwd').value='czbkios008'"
        webView.stringByEvaluatingJavaScriptFromString(js)
    }
    
    func close() {
        SVProgressHUD.dismiss()
        dismissViewControllerAnimated(true, completion: nil)
    }
    
    // MARK: - 懒加载
    lazy var webView: UIWebView = UIWebView()
}

extension CZOauthViewController: UIWebViewDelegate {
    // SVProgressHUD.showWithStatus 只要不去关闭会一直显示
    // SVProgressHUD.showInfoWithStatus 过2秒自动关闭
    
    // webView开始加载请求
    func webViewDidStartLoad(webView: UIWebView) {
        // 只要不去关闭会一直显示
        SVProgressHUD.showWithStatus("正在加载登录界面", maskType: SVProgressHUDMaskType.Black)
    }
    
    // webView加载完毕调用
    func webViewDidFinishLoad(webView: UIWebView) {
        // 关闭指示器
        SVProgressHUD.dismiss()
    }
    
    // webView加载失败时调用
    func webView(webView: UIWebView, didFailLoadWithError error: NSError?) {
        print("error: \(error)")
        SVProgressHUD.dismiss()
        // 没有网络错误的code = 1009
        if error?.code != 102 {
            SVProgressHUD.showErrorWithStatus("加载失败", maskType: SVProgressHUDMaskType.Black)
        }
    }
    
    // webView询问我们是否要去加载某个请求: true去加载,false不加载
    func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        let urlString = request.URL?.absoluteString
        print("webView加载: \(urlString)")
        
        // 点击 取消 按钮: http://www.baidu.com/?error_uri=%2Foauth2%2Fauthorize&error=access_denied&error_description=user%20denied%20your%20request.&error_code=21330
        // 点击 授权 按钮:http://www.baidu.com/?code=8df6d4256e39b0c6babb56a29fb15cf4
        // 通过?后面是code=表示点击了授权按钮,不是code=开头,点击的是取消按钮
        
        // 1.判断是否是回调地址开头.是回调地址开头,表示用点击的是授权或取消按钮
        if urlString!.hasPrefix(CZNetworkTool.sharedInstance.redirect_uri) {
            // 判断点击的是授权还是取消
            // 截取url地址?后面的请求参数
            // query:?后面的请求参数
            let query = request.URL?.query
            print("query: \(query)")
            
            // 判断query是以code=开头表示点击的是 授权按钮, 其它的点击的是 取消 按钮
            let codeString = "code="
            if query!.hasPrefix(codeString) {
                let queryNS = query! as NSString
                // 2.授权按钮,截取code的值
                let code = queryNS.substringFromIndex(codeString.characters.count)
                print("code: \(code)")
                
                // 如果将和模型相关的事情放到控制器里面,控制器关心的事情太多了,控制器的代码比较臃肿.专门创建一个类来处理和模型相关的操作MVVM
                // ViewMode:模型相关的操作不放到控制器里面,放到ViewModel
                
                // 3.1 调用CZUserAccountViewModel的方法去加载请求
                CZUserAccountViewModel.sharedInstance.loadAccessToken(code, loadAccessTokenCallBack: { (error) -> () in
                    if error != nil {
                        print("获取accessToken出错了: \(error)")
                        SVProgressHUD.showErrorWithStatus("网络不给力")
                        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (Int64)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), { () -> Void in
                            // 关闭控制器
                            self.close()
                        })
                        
                        return 
                    }
                    
                    // 账户保存成功了
                    self.close()
                    
                    // 跳转到CZWelcomeViewController
//                    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
//                    appDelegate.switchRootViewController(false)
                    AppDelegate.outSwitchRootViewController(false)
                })
            } else {
                // 取消按钮,关闭控制器
                close()
            }
            
            return false
        } else {
            // 2.不是授权回调地址,直接加载这个请求
            return true
        }
    }
}